La geometría que aparece en las vistas 3D de FreeCAD se renderiza mediante la biblioteca Coin3D. Coin3D es una implementación del estándar Open Inventor. El software OpenCASCADE también ofrece la misma funcionalidad, pero en las primeras etapas de FreeCAD se decidió no utilizar el visor OpenCASCADE integrado, sino optar por el software Coin3D, de mayor rendimiento. Una buena manera de aprender sobre esta biblioteca es consultar el libro Open Inventor Mentor.
[1] Open Inventor es un lenguaje de descripción de escenas 3D. La escena descrita en Open Inventor se renderiza en OpenGL en la pantalla. Coin3D se encarga de esto, por lo que los programadores no necesitan lidiar con llamadas complejas a OpenGL y solo necesitan proporcionar código Open Inventor válido. La gran ventaja es que Open Inventor es un estándar muy conocido y bien documentado.
Una de las principales funciones de FreeCAD es traducir la información geométrica de OpenCASCADE al lenguaje de Open Inventor.
Open Inventor describe una escena 3D en forma de un grafo de escena, como el que se muestra a continuación:
Imagen tomada de Inventor Mentor
Un grafo de escena de Open Inventor describe todo lo que forma parte de una escena 3D, como la geometría, los colores, los materiales, las luces, etc., y organiza todos esos datos en una estructura clara y práctica. Todo se puede agrupar en subestructuras, lo que permite organizar el contenido de la escena prácticamente como se desee. Aquí hay un ejemplo de un archivo de Open Inventor:
#Inventor V2.0 ascii
Separator {
RotationXYZ {
axis Z
angle 0
}
Transform {
translation 0 0 0.5
}
Separator {
Material {
diffuseColor 0.05 0.05 0.05
}
Transform {
rotation 1 0 0 1.5708
scaleFactor 0.2 0.5 0.2
}
Cylinder {
}
}
}
Como puede apreciar, la estructura es muy simple. Se utilizan separadores para organizar los datos en bloques, de forma similar a como se organizan los archivos en carpetas. Cada instrucción afecta a la siguiente; por ejemplo, los dos primeros elementos de nuestro separador raíz son una rotación y una traslación, y ambos afectarán al siguiente elemento, que es otro separador. En este separador se define un material y otra transformación. Por lo tanto, nuestro cilindro se verá afectado por ambas transformaciones: la que se le aplica directamente y la que se aplicó a su separador padre.
También disponemos de muchos otros elementos para organizar nuestra escena, como grupos, interruptores o anotaciones. Podemos definir materiales muy complejos para nuestros objetos, con colores, texturas, modos de sombreado y transparencia. Asimismo, podemos definir luces, cámaras e incluso movimiento. Incluso es posible insertar fragmentos de código en archivos de Open Inventor para definir comportamientos más complejos.
Si está interesado en aprender más sobre Open Inventor, diríjase directamente a su referencia más famosa: el Inventor mentor.
En FreeCAD, normalmente no se necesita interactuar directamente con el grafo de escena de Open Inventor. Cada objeto en un documento de FreeCAD, ya sea una malla, una forma de una pieza o cualquier otra cosa, se convierte automáticamente a código de Open Inventor y se inserta en el grafo de escena principal que se ve en una vista 3D. Este grafo de escena se actualiza continuamente al modificar, agregar o eliminar objetos. De hecho, cada objeto (en el espacio de la aplicación) tiene un proveedor de vista (un objeto correspondiente en el espacio de la interfaz gráfica) responsable de generar el código de Open Inventor.
Acceder directamente al grafo de escena tiene muchas ventajas. Por ejemplo, se puede cambiar temporalmente la apariencia de un objeto o añadir a la escena objetos que no existen realmente en el documento de FreeCAD, como geometrías de construcción, ayudantes, sugerencias gráficas o herramientas como manipuladores o información en pantalla.
FreeCAD incluye varias herramientas para ver o modificar el código de Open Inventor. Por ejemplo, el siguiente código Python mostrará la representación de Open Inventor de un objeto seleccionado:
obj = FreeCAD.ActiveDocument.ActiveObject
viewprovider = obj.ViewObject
print viewprovider.toString()
Pero también tenemos un módulo de Python que permite el acceso completo a todo lo gestionado por Coin3D, como nuestro grafo de escena de FreeCAD. Así que, debería continuar leyendo en Pivy.
Consulte los fragmentos de código de Coin3D, cortesía de la investigación de MariwanJ para el entorno de trabajo Design456. El repositorio del código se encuentra en https://github.com/MariwanJ/COIN3D_Snippet.